#ifndef __TYPES_H__
#define __TYPES_H__

#include "util/macro/make_enum.h"

MAKE_ENUM_CLASS(NodeType, //
                Undefined,
                /* Assemble | 集合类型的节点将若干节点集合到一起，使它们以不同的逻辑执行 */
                Sequence,           // 顺序执行
                Select,             // 选择一个执行
                FiniteStateMachine, // 按状态机执行
                Parallel,           // 并行执行
                /* Action | 动作类型的节点将节点的输入或输出进行处理，使它们的父/子节点以和设定的规则不同的逻辑执行 */
                Decorator, //
                Processor, //
                Condition  //
)

MAKE_ENUM_CLASS(NodeStatus, //
                Unknown, NotReady, Success, Running, Failure)

inline bool StatusReady(const NodeStatus& status) { return status == NodeStatus::Unknown; }
inline bool StatusCompleted(const NodeStatus& status) { return status == NodeStatus::Success or status == NodeStatus::Failure; }
inline bool StatusRunning(const NodeStatus& status) { return status == NodeStatus::Running; }

MAKE_ENUM_CLASS(StreamPortType, In, Out, InOut)

MAKE_ENUM_CLASS(ScriptType,    //
                OnEnter,       //
                IfIsReady,     //
                IfNotReady,    //
                BeforeProcess, //
                AfterProcess,  //
                IfSuccess,     //
                IfRunning,     //
                IfFailed,      //
                OnExit         //
)

#endif // __TYPES_H__